package com.niit.session22;

import java.util.function.Consumer;
import java.util.function.Function;

public class Test {
	public static void main(String[] args) {
		/************************** 使用匿名内部类实现接口并重写方法 *****************************/
		Calculate c = new Calculate() {
			@Override
			public void calculate(int a, int b) {
				System.out.println("运算的结果是：" + (a * b));
			}
		};
		c.calculate(3, 2);
		/******************************** 使用Lambda表达式实现接口并重写方法	 *******************************************/
//		最基础的lambda表达式
//		Lambda表达式实际上是省略了方法名字的方法，只关注形参和方法体
		Calculate c1 = (int a, int b) -> {
			System.out.println("运算的结果是：" + (a * b));
		};
		c1.calculate(5, 2);
//			形参中的数据类型可以省略
		Calculate c2 = (a, b) -> {
			System.out.println("运算的结果是：" + (a * b));
		};
		c2.calculate(5, 2);
//		如果方法体只有一行代码，可以省略方法体的大括号
		Calculate c3 = (a, b) ->System.out.println("运算的结果是：" + (a * b));
		c3.calculate(5, 2);
//		使用Java提供的基础函数式接口
		Function<Integer, Integer> function = (a) -> {
			return a*2;
		};
		System.out.println(function.apply(5));
//		如果形参只有一个，可以省略形参的括号，
//		如果return语句一行代码就可以实现，可以省略return关键字,简便，优雅
		Function<Integer, Integer> function1 = a -> a*2;
		System.out.println(function1.apply(6));
		
		
		
//		使用Consumer打印一个内容
		Consumer<String> consumer = i-> System.out.println(i);
		consumer.accept("Hello");
//		方法引用：如果方法体里调用的方法的形参和函数式接口里定义的形参一致，可以使用方法引用的写法
//		省略形参和箭头->
		Consumer<String> consumer1 = System.out::println;
		consumer1.accept("Hello");
//		lambda表达式实际上是一个匿名内部类的对象，可以当成参数来传递
		test((a, b) ->System.out.println("运算的结果是：" + (a * b)));
		
	}
	
	public static void test(Calculate c) {
		c.calculate(2, 3);
		
	}
	
}
